/*
 * Copyright 2023-2025, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * 龙芯LoongArch64架构定时器头文件
 * 本文件定义龙芯平台的定时器相关常量和结构
 */
#ifndef _KERNEL_ARCH_LOONGARCH64_TIMERS_LOONGARCH_TIMER_H
#define _KERNEL_ARCH_LOONGARCH64_TIMERS_LOONGARCH_TIMER_H

#include <SupportDefs.h>

// 龙芯平台定时器相关常量
#define LOONGARCH_STABLE_COUNTER_FREQ 100000000 // 稳定计数器频率（100MHz）

// 定时器CSR寄存器地址
#define CSR_TMID 0x40 // 定时器ID
#define CSR_TCFG 0x41 // 定时器配置
#define CSR_TVAL 0x42 // 定时器初值
#define CSR_CNTC 0x43 // 计数器补偿值
#define CSR_TICLR 0x44 // 定时器中断清除

// 定时器配置位
#define TCFG_EN (1ULL << 0)     // 定时器使能
#define TCFG_PERIOD (1ULL << 1) // 周期性模式
#define TCFG_INT_EN (1ULL << 2) // 中断使能

// 定时器中断号
#define TIMER_IRQ 11

// 读取CSR寄存器
static inline uint64
read_csr(uint32 reg)
{
    uint64 val;
    asm volatile("csrrd %0, %1" : "=r"(val) : "i"(reg));
    return val;
}

// 写入CSR寄存器
static inline void
write_csr(uint32 reg, uint64 val)
{
    asm volatile("csrwr %0, %1" : : "r"(val), "i"(reg));
}

#endif // _KERNEL_ARCH_LOONGARCH64_TIMERS_LOONGARCH_TIMER_H